﻿using BLevy.Entidad;
using BLevy.Negocio;
using MySql.Data.MySqlClient;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Configuration;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace BLevy.UI
{
    public partial class frmPeriodoGenerar : Form
    {
        Utils.Numeros u = new Utils.Numeros();
        DateTime ultimo_periodo;
        IList<Socio> sociosL;

        private frmPrincipal parent = null;
        public frmPeriodoGenerar()
        {
            InitializeComponent();
        }

        private void frmPeriodoGenerar_Load(object sender, EventArgs e)
        {
            try
            {
                sociosL = Negocio.Socios.FindAll().ToList();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }

            inicializar();

            parent = (frmPrincipal)this.MdiParent;
        }

        private void inicializar()
        {
            try
            {
                Periodo ultP = Periodos.FindLast();

                if (ultP == null)
                {
                    ultimo_periodo = DateTime.Now;
                }
                else
                {
                    ultimo_periodo = ultP.periodo;
                    lblUltimoPeriodo.Text = ultimo_periodo.ToString("MMMM/yyyy");
                }

                DateTime proximo_periodo = ultimo_periodo.AddMonths(1);
                dtpPeriodo.Value = proximo_periodo;

                dtpVencimiento1.Value = new DateTime(proximo_periodo.Year, proximo_periodo.Month, 15);
                dtpVencimiento2.Value = new DateTime(proximo_periodo.Year, proximo_periodo.Month, 27);

                limpiarProgreso();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void limpiarProgreso()
        {
            progressBar.MarqueeAnimationSpeed = 0;
            lblMensaje.Visible = false;
        }

        private void dtpPeriodo_ValueChanged(object sender, EventArgs e)
        {
            dtpVencimiento1.Value = new DateTime(dtpPeriodo.Value.Year, dtpPeriodo.Value.Month, 15);
            dtpVencimiento2.Value = new DateTime(dtpPeriodo.Value.Year, dtpPeriodo.Value.Month, 27);
        }

        private void btnGenerar_Click(object sender, EventArgs e)
        {
            if (Convert.ToBoolean(parent.usuario.rol.permisos.insertar) == true)
            {
                if (string.IsNullOrEmpty(txtRecargo.Text))
                {
                    DialogResult dr = MessageBox.Show("¿Desea generar el período sin recargo?", "Atención", MessageBoxButtons.YesNo);
                    if (dr == System.Windows.Forms.DialogResult.Yes)
                    {
                        txtRecargo.Text = "0";
                    }
                    else
                    {
                        txtRecargo.SelectAll();
                    }
                }

                if (!string.IsNullOrEmpty(txtRecargo.Text))
                {
                    limpiarProgreso();
                    progressBar.Style = ProgressBarStyle.Marquee;
                    progressBar.MarqueeAnimationSpeed = 30;
                    lblMensaje.Visible = true;
                    backgroundWorker.RunWorkerAsync();
                }
            }
            else
            {
                MessageBox.Show("No tiene privilegios para realizar la operación", "Información", MessageBoxButtons.OK, MessageBoxIcon.Warning);
            }
        }

        private int GenerarPeriodos()
        {

            int res = 0;
            try
            {
                // insertar periodo
                Periodo _periodo = new Periodo();
                _periodo.periodo = new DateTime(dtpPeriodo.Value.Year, dtpPeriodo.Value.Month, 1);
                _periodo.fecha_generacion = DateTime.Now.Date;
                _periodo.vencimiento_1 = dtpVencimiento1.Value.Date;
                _periodo.vencimiento_2 = dtpVencimiento2.Value.Date;
                _periodo.recargo = Convert.ToDouble(u.AgregarDecimales(txtRecargo.Text));

                int ultimoPeriodo = Convert.ToInt32(ultimo_periodo.Year.ToString() + ultimo_periodo.Month.ToString("0#"));
                int periodoActual = Convert.ToInt32(_periodo.periodo.Year.ToString() + _periodo.periodo.Month.ToString("0#"));

                if (periodoActual > ultimoPeriodo)
                {
                    res = Periodos.GenerarPeriodo(_periodo);

                    if (res == -2)
                    {
                        MessageBox.Show("El período ya existe, ingrese un nuevo período e intente nuevamente.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        limpiarProgreso();
                    }
                }
                else
                {
                    MessageBox.Show("El período a generar debe ser mayor al último período generado.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }

            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                limpiarProgreso();
            }

            return res;
        }

        private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
        {
            //Thread.Sleep(1000);
            e.Result = GenerarPeriodos();
        }

        private void backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            int res = Convert.ToInt32(e.Result);

            try
            {
                if (res > 0)
                {
                    IList<Socio> sociosBajaL = Negocio.Socios.FindBajasAutomaticas(DateTime.Now.Date);

                    MessageBox.Show("Los períodos se generaron correctamente.", "Información", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    this.Close();
                    inicializar();

                    if (sociosBajaL.Count > 0)
                    {
                        frmSocioBajaAutomaticaReporte frm = new frmSocioBajaAutomaticaReporte(sociosBajaL);
                        frm.Show();
                    }

                }
                else
                {
                    MessageBox.Show("Ocurrio un error al generar el período. Intente nuevamente.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    limpiarProgreso();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                limpiarProgreso();
            }
        }

        private void btnCerrar_Click(object sender, EventArgs e)
        {
            this.Close();
        }
    }
}
